在 Go 的網路應用程式開發中,路由是一個至關重要的部分。它決定了每一個收到的請求應該由哪個處理器函數處理,這樣你的應用程式就知道該如何回應不同的路徑。Go 提供了內建的 net/http 套件,其中包含了一個簡單而強大的路由機制。
在 Web 開發中,一個網頁通常有多個頁面或端點,每個端點對應著不同的功能。路由就像是地圖上的指南針,指引著請求應該前往哪個處理器,它使得代碼更有組織性,易於擴展。
Go 的 net/http 套件提供了一個名為 ServeMux 的類型,這是一個 HTTP 請求多路徑器。它可以將不同的路徑映射到不同的處理器函數。我們稍微修改一下昨天的例子:
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
pageVariables := PageVariables{
Title: "冒險開始",
Message: "歡迎來到冒險之旅!",
}
tmpl, err := template.New("index").Parse(`
<!DOCTYPE html>
<html>
<head>
<title>{{.Title}}</title>
</head>
<body>
<h1>{{.Title}}</h1>
<p>{{.Message}}</p>
</body>
</html>
`)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
err = tmpl.Execute(w, pageVariables)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
func aboutHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "This is the about page.")
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", handler)
mux.HandleFunc("/about", aboutHandler)
http.ListenAndServe(":8080", mux)
}
我增加了一個 aboutHandler
的函示,並在 main()
增加了一些東西,當 go build
完這支程式碼並執行後,我們到瀏覽器輸入 http://127.0.0.1:8080/
後,我們可以看到頁面上出現跟昨天一樣的畫面,此時,在網址後面增加一個 about
,這時,我們就可以看到 This is the about page.
,這是因為homeHandler
函數處理根路徑 ("/") 的請求,而 aboutHandler
函數處理 "/about" 路徑的請求。如果再搭配昨天提到的 templete,你就可以將 HTML
模板與路由結合,以動態生成頁面內容。
有時候,我們需要處理包含變數的路徑,例如,一個用戶的個人資料頁面可能是 "/user/{username}"。net/http 套件也支援這種動態路由的設定,讓我在原本的程式中增加一些 user 的資料,如下:
func userHandler(w http.ResponseWriter, r *http.Request) {
username := r.URL.Query().Get("username")
fmt.Fprintf(w, "Welcome, %s!", username)
}
func main() {
mux := http.NewServeMux()
// 設定動態路由
mux.HandleFunc("/user", userHandler)
// 啟動 HTTP 伺服器
http.ListenAndServe(":8080", mux)
}
我在原本的程式中增加了一個 userhandler
,並且在 main()
增加一個處理 /user
的路由,go build
完這支程式碼並執行後,我們到瀏覽器輸入 http://127.0.0.1:8080/user
,此時,瀏覽器便會出現 Welcome, !
,如下:
你會覺得哪裡怪怪的,username 跑去哪了,這是因為使用者的名稱是通過 URL 參數傳遞的。所以當訪問 "/user?username=John" 時,將會顯示 "Welcome, John!"。
Go 的 net/http
提供了一個簡單而有效的路由機制,能夠滿足大多數 Web 開發的需求。這使得應用程式的結構清晰,易於擴展。隨著 URL 越來越複雜,我們也可以將其彙整到一個專門處理路由的資料夾。
另外,在正常情況下,我們不會透過 URL.Query
的方式去手動輸入使用者名稱去取得相關資料,而這些資料是被存在哪裡呢?所以明天我將介紹該如何去儲存使用者資料。